/*
 * colas.c
 *
 *  Created on: 27/09/2011
 *      Author: utn_so
 */

#include <stdlib.h>
#include <stdio.h>

typedef struct Celda {
	int elemento;
	struct Celda *siguiente;
} celda;

typedef struct {
	celda *ant, *post;
} tcola;

typedef tcola *cola;

cola CREAR() {
	cola C;
	C = (tcola *) malloc(sizeof(tcola));
	if (C == NULL
	)
		perror("Memoria insuficiente.");
	C->ant = C->post = (celda *) malloc(sizeof(celda));
	if (C->ant == NULL
	)
		perror("Memoria insuficiente.");
	C->ant->siguiente = NULL;
	return C;
}

void DESTRUIR(cola C)

{
	while (!VACIA(C))
		QUITAR_DE_COLA(C);
	free(C->ant);
	free(C);
}

int VACIA(cola C)

{
	return (C->ant == C->post);
}

int FRENTE(cola C)

{
	if (VACIA(C)) {
		perror("Error: Cola Vacia.");
	}
	return (C->ant->elemento);
}

void INSERTAR_PRIMERO(int x, cola C)

{
	C->post->siguiente = (celda *) malloc(sizeof(celda));
	  C->post->elemento = x;
	  C->post->siguiente->siguiente = C->ant;
	  C->ant = C->post->siguiente;
}

void PONER_EN_COLA(int x, cola C)

{
	celda *actual, *auxiliar;
	actual = C->ant;
	if (actual->elemento >= x) {
		INSERTAR_PRIMERO(x, C);
	} else {
		while (abs(actual->elemento - x)
				> abs(actual->siguiente->elemento - actual->elemento)) {
			actual = actual->siguiente;
		}

		auxiliar = actual->siguiente;
		actual->siguiente = (celda *) malloc(sizeof(celda));
		actual = actual->siguiente;
		actual->elemento = x;
		actual->siguiente = auxiliar;
	}
}

void QUITAR_DE_COLA(cola C) {
	celda *aux;

	if (VACIA(C))
		perror("Cola vacia.");
	aux = C->ant;
	C->ant = C->ant->siguiente;
	free(aux);
}
